﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using ThoughtWorks.QRCode.Codec;
using ThoughtWorks.QRCode.Codec.Data;

namespace YiSha.Util
{
    public class QRcodeHelper
    {
        public static byte[] CreateQRcodeByte(string strValue, int size)
        {
            return ImageToByteArray(CreateQRcodeImage(strValue, size));
        }

        public static byte[] CreateQRcodeByte(string strValue, int size, System.Drawing.Imaging.ImageFormat type)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                CreateQRcodeImage(strValue, 3).Save(ms, type);
                return ms.ToArray();
            }
        }

        /// <summary>
        /// 生成二维码
        /// </summary>
        /// <param name="strdata">需要生成二维码的字符</param>
        /// <param name="size">二维码的大小为正整数默认为3</param>
        /// <returns></returns>
        public static Image CreateQRcodeImage(string strValue, int size = 5)
        {
            Image image = null;
            try
            {
                QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
                qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
                if (size < 0)
                    size = 3;
                int scale = Convert.ToInt16(size);
                /*
                 *二维码的大小
                 */
                qrCodeEncoder.QRCodeScale = scale;
                int version = Convert.ToInt16(0);
                /*
                 *QrcodeVersion的范围值是0-40,0的含义是表示压缩的信息量将会根据实际传入值确定，
                 *只有最高上限的控制，而且图片的大小将会根据信息量自动缩放。1-40的范围值，则有固定的信息量上限，
                 *而且图片的大小会固定在一个大小上，不会根据信息量的多少而变化。
                 */
                qrCodeEncoder.QRCodeVersion = version;
                /*
                 *纠错能力
                 *L级：约可纠错7%的数据码字;
                 *M级：约可纠错15%的数据码字;
                 *Q级：约可纠错25%的数据码字;
                 *H级：约可纠错30%的数据码字
                 */
                qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
                image = qrCodeEncoder.Encode(strValue, Encoding.UTF8);
            }
            catch
            {
            }
            return image;
        }

        /// <summary>
        /// 读取二维码图片数据
        /// </summary>
        /// <returns>图片路径</returns>
        public static string ReaderQRimg(string imgPath)
        {
            String decodeStr = "";
            try
            {
                if (!File.Exists(imgPath))
                {
                    decodeStr = "图片源不存在!";
                }
                else
                {
                    using (FileStream imageFile = new FileStream(imgPath, FileMode.Open))
                    {
                        Bitmap bimap = new Bitmap(imageFile);
                        QRCodeImage qrimg = new QRCodeBitmapImage(bimap);
                        QRCodeDecoder decoder = new QRCodeDecoder();
                        decodeStr = decoder.decode(qrimg, Encoding.UTF8);
                    }
                }
            }
            catch
            {
                decodeStr = "无法解析!原因:二维码图片破损或者不是二维码图片";
            }
            return decodeStr;
        }

        public static byte[] ImageToByteArray(Image image)
        {
            MemoryStream ms = new MemoryStream();
            image.Save(ms, ImageFormat.Bmp);
            return ms.ToArray();
        }
    }
}
